/*
不管条件是否成立，【判断体】当中出现的var或则function都会进行变量提升
，但是在最新版本的浏览器当中，function声明的变量只能提前声明不能定义了(老版本ie会)。
*/

//case:1
// console.log(num); //undefined
// console.log(fn); //undefined
// if(1 === 1){
//     var num = 12;
//
//     function fn() {
//
//     }
// }
// console.log(num); //12
// console.log(fn); //[Function: fn]


/*
代码执行到条件判断的地方

[条件不成立]
进入不到判断体中，此时之前声明的变量或则函数依然是undefined
*/

//case:2
// console.log(num); //undefined
// console.log(fn); //undefined
// if(1 !== 1){ //不会走进去 也就不会定义
//     var num = 12;
//
//     function fn() {
//
//     }
// }
// console.log(num); //undefined
// console.log(fn); //undefined

/*
[条件成立]
进入条件判断体中的第一件事情不是代码执行，而是把之前变量提升没有定义的函数首先定义了（进入到判断体中函数就定义了，为了迎合ES6中的块级作用域）
*/

//case:3
// console.log(num); //->undefined
// console.log(fn); //->undefined
// if(1 === 1){ //进入后会先定义，再执行代码
//     console.log(num); //->undefined
//     console.log(fn); // [Function: fn] ->函数体本身
//     var num = 12;
//     function fn(){}
//     console.log(num); //->12
//     console.log(fn); // [Function: fn] =>函数体本身
// }
// console.log(fn); // [Function: fn] =>函数体本身


/*
条件除了if else switch case

循环也是条件（想一想 i=0;i<x;++i ），for、for in
*/

// console.log(fn); //undefined
// for(var i=0;i<9;++i){
//     function fn(){}
// }





//新版本浏览器会报错；
//旧版本：false false
var f = function(){
    return true;
}
var g = function(){
    return false;
}
~function(){
    //=>[私有作用域]
    //变量提升：g
    //虽然g提升了但在新版本中，因为这货在判断体里，只提升不会定义
    //故g()报错 TypeError: g is not a function
    if(g()&&[]==![]){
        f=function(){
            return false;
        };

        function g(){ //只在私有作用域有用 相当于fn{var a = 1} a就只在fn作用域里拿得到
            return true;
        }
    }
}();
console.log(f());
console.log(g());